Skip to content

Gitweb mit git-http-backend auf Debian einrichten

Ziel ist es ein Git Repository über http mit git-http-backend (auch bekannt als smart http) einzurichten. In dieser Dokumentation habe ich $MYPROJECT und $MYUSERNAME als Platzhalter verwendet. Diese müssten dann natürlich mit den korrekten Namen gefüllt werden. Die Beispieldomain ist die Alt bekannte example.com.

Zuerst installieren wir die benötigten Pakete.

root:~# apt-get install git apache2 gitweb

Nun aktivieren wir die folgenden Apache Module und starten den Webserver neu.

root:~# a2enmod env alias fcgid auth_digest
root:~# service apache2 restart

Dann erstellen wir uns eine VHost Datei.

root:~# vi /etc/apache2/sites-available/gitweb.example.com.conf
<VirtualHost *:80>
   ServerAdmin operations@example.com
   ServerName gitweb.example.com
   DocumentRoot /var/www/html
   <IfModule mod_rewrite.c>
      <IfModule mod_ssl.c>
         RewriteEngine On
         RewriteCond %{SERVER_PORT} !^443$
         RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [R=302,L]
      </IfModule>
   </IfModule>
</VirtualHost>

<IfModule mod_ssl.c>
   <VirtualHost *:443>
      # Global Settings
      ServerAdmin operations@example.com
      ServerName gitweb.example.com
      DocumentRoot /usr/share/gitweb

      # Directory Settings
      <Directory /usr/share/gitweb>
         Options +FollowSymLinks +ExecCGI
         AddHandler cgi-script .cgi
         DirectoryIndex gitweb.cgi
      </Directory>

      # Git configuration
      # Enable git clone/push/fetch etc over http:
      ScriptAliasMatch \
        "(?x)^/(.*/(HEAD | \
        info/refs | \
        objects/(info/[^/]+ | \
        [0-9a-f]{2}/[0-9a-f]{38} | \
        pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
        git-(upload|receive)-pack))$" \
        /usr/lib/git-core/git-http-backend/$1

      <IfModule mod_env.c>
         SetEnv GIT_PROJECT_ROOT /var/lib/git
         SetEnv GIT_HTTP_EXPORT_ALL
         SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
         SetEnv GIT_SMART_HTTP=0
      </IfModule>

      <Location />
        AuthType Digest
        AuthName "Shared Git Repo"
        AuthUserFile "custom.d/git-password.digest"
        <RequireAll>
                Require env IP_OFFICE
                Require  valid-user
        </RequireAll>
      </Location>

      # Enable SSL
      SSLEngine on
      SSLCertificateFile custom.d/certs.d/wildcard.example.com.crt
      SSLCACertificateFile custom.d/certs.d/AlphaSSLroot.crt
      SSLCertificateKeyFile custom.d/certs.d/wildcard.example.com.key
      SSLProtocol all -SSLv2 -SSLv3

      # Logfile Settings
      ErrorLog "${APACHE_LOG_DIR}/gitweb.example.com_err.log"
      CustomLog "${APACHE_LOG_DIR}/gitweb.example.com_acc.log" common
      LogLevel warn
   </VirtualHost>
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Nun erstellen wir uns die Passwort Datei. den Schalter -c benötigen wir nur bei dem ersten Benutzer. Existiert die Datei bereits, dann können wir den Schalter -c weg lassen.

root:~# htdigest -c /etc/apache2/custom.d/git-password.digest "Shared Git Repo" ${MYUSERNAME}

Nun konfigurieren wir noch gitweb wie folgt.

root:~# cp /etc/gitweb.conf /etc/gitweb.conf.dist
root:~# echo -e '$projectroot = "/var/lib/git";' >/etc/gitweb.conf
root:~# echo '$git_temp = "/tmp";' >>/etc/gitweb.conf

Jetzt erstellen wir uns das Git Repository auf dem Server.

root:~# mkdir -p /var/lib/git
root:~# cd /var/lib/git
root:/var/lib/git# git init --bare --shared ${MYPROJECT}.git
root:/var/lib/git# echo "Git Repository ${MYPROJECT}" >${MYPROJECT}.git/description
root:/var/lib/git# echo -e "[gitweb]\n\towner = \"${MYUSERNAME}\"" >>${MYPROJECT}.git/config
root:/var/lib/git# cd ${MYPROJECT}.git/
root:/var/lib/git/${MYPROJECT}# git update-server-info
root:/var/lib/git# chown -R www-data.www-data /var/lib/git
root:/var/lib/git# cd

Nun aktivieren wir den Apache VHost und starten den Webserver neu. Eigentlich würde ein reload ausreichen, da wir in unserer Konfiguration SSL verwenden, muss der Apache neu gestartet werden.

root:~# a2ensite gitweb.example.com.conf
root:~# service apache2 restart

Achtung

Leeres Git Repository lässt sich nicht klonen Ein neues, leeres Repository, welches mit git init –bare erstellt wurde, kann man nicht klonen. Wir müssen auf dem Server erst eine Datei (z.B. README) im Repository commiten, bevor wir das Repository remote verwenden können.

Auf dem Server werden wir nun das neue Repository klonen und eine erste Datei (README) hinzufügen.

root:~# cd ~/tmp
root:~/tmp# git clone /var/lib/git/${MYPROJECT}.git
root:~/tmp# cd ${MYPROJECT}/
root:~/tmp/${MYPROJECT}# git status
root:~/tmp/${MYPROJECT}# touch README
root:~/tmp/${MYPROJECT}# git add .
root:~/tmp/${MYPROJECT}# git config --local user.name ${MYUSERNAME}
root:~/tmp/${MYPROJECT}# git config --local user.email ${MYUSERNAME}@example.com
root:~/tmp/${MYPROJECT}# git commit -m "initial commit"
root:~/tmp/${MYPROJECT}# git push origin master
root:~/tmp/${MYPROJECT}# cd

Nun ist unser Git Repository fertig. Das werden wir gleich auf unseren lokalen Rechner testen.

tux@earth:~$ cd ~/tmp
tux@earth:~/tmp$ git clone https://gitweb.example.com/${MYPROJECT}.git
tux@earth:~/tmp$ cd ${MYPROJECT}/
tux@earth:~/tmp/${MYPROJECT}$ echo "Hello Gitty" >README
tux@earth:~/tmp/${MYPROJECT}$ git add .
tux@earth:~/tmp/${MYPROJECT}$ git config --local user.name ${MYUSERNAME}
tux@earth:~/tmp/${MYPROJECT}$ git config --local user.email ${MYUSERNAME}@example.com
tux@earth:~/tmp/${MYPROJECT}$ git commit -m "some changes"
tux@earth:~/tmp/${MYPROJECT}$ git push origin master

Screenshot von Gitweb

Screenshot von Gitweb

Als Theme verwende ich ein eigenes Theme, welches man sich als gitweb-tuxnet24.tar.gz herrunter laden kann.

Als grafischen Git Client verwende ich SmartGit, was man sich von http://www.syntevo.com/smartgit/download herrunter laden kann. Der Client ist für Linux, Mac OS und Windows verfügbar und basiert auf Java.

Dokumentation